/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.powerhua.xsys.workflow.web;

import com.powerhua.workflow.jbpm.deploy.JbpmDeploy;
import com.powerhua.workflow.jbpm.deploy.impl.JbpmDeployImpl;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.log4j.Logger;

/**
 *
 * @author Brian.Xie
 */
public class WorkflowDefUploadServlet extends HttpServlet {

    private Logger logger = Logger.getLogger(WorkflowDefUploadServlet.class);

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        // 设置字符编码为UTF-8, 这样支持汉字显示
        response.setCharacterEncoding("UTF-8");

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String result = upload(request);
            String tmp = "<script type='text/javascript'>"
                    + "parent.workflowDefUploadCallback('" 
                    + result + "');"
                    + "</script>";
            out.print(tmp);
        } finally {
            out.close();
        }
    }

    private String upload(HttpServletRequest request) {
        // 设置上传文件最大为 3M
        final long MAX_SIZE = 3 * 1024 * 1024;
        // 允许上传的文件格式的列表
        final String[] allowedExt = new String[]{"zip"};

        // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
        DiskFileItemFactory dfif = new DiskFileItemFactory();
        // 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
        dfif.setSizeThreshold(4096);
        // 设置存放临时文件的目录
        dfif.setRepository(new File("d:/temp/workflowDefFileUploadTemp"));

        // 用以上工厂实例化上传组件
        ServletFileUpload sfu = new ServletFileUpload(dfif);
        // 设置最大上传尺寸
        sfu.setSizeMax(MAX_SIZE);

        // 从request得到 所有 上传域的列表
        List fileList = null;
        try {
            fileList = sfu.parseRequest(request);
        } catch (FileUploadException e) {// 处理文件尺寸过大异常
            if (e instanceof SizeLimitExceededException) {
                return "<result type=\"error\">文件尺寸超过规定大小:" + MAX_SIZE + "字节.</result>";
            }
            logger.error("====== 上传文件出错.", e);
            return "<result type=\"error\">上传文件出错.</result>";
        }
        // 没有文件上传
        if (fileList == null || fileList.size() == 0) {
            return "<result type=\"error\">请选择上传文件.</result>";
        }
        // 得到所有上传的文件
        Iterator fileItr = fileList.iterator();
        // 循环处理所有文件
        // 上传文件数量临时变量
        int fileNumber = 0;
        StringBuffer deployResultXml = new StringBuffer("");
        while (fileItr.hasNext()) {
            FileItem fileItem = null;
            String path = null;
            long size = 0;
            // 得到当前文件
            fileItem = (FileItem) fileItr.next();
            // 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
            if (fileItem == null || fileItem.isFormField()) {
                continue;
            }

            // 上传文件数量不能超过一个
            if (fileNumber > 0) {
                return "<result type=\"error\">上传文件数量不能超过一个.</result>";
            }

            fileNumber++;
            // 得到文件的完整路径
            path = fileItem.getName();
            // 得到文件的大小
            size = fileItem.getSize();
            if ("".equals(path) || size == 0) {
                return "<result type=\"error\">请选择上传文件.</result>";
            }

            // 得到去除路径的文件名
            String t_name = path.substring(path.lastIndexOf("\\") + 1);
            // 得到文件的扩展名(无扩展名时将得到全名)
            String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
            // 拒绝接受规定文件格式之外的文件类型
            int allowFlag = 0;
            int allowedExtCount = allowedExt.length;
            for (; allowFlag < allowedExtCount; allowFlag++) {
                if (allowedExt[allowFlag].equals(t_ext)) {
                    break;
                }
            }
            if (allowFlag == allowedExtCount) {
                String outStr = "请上传以下类型的文件";
                for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++) {
                    outStr += "*." + allowedExt[allowFlag] + "";
                }
                return "<result type=\"error\">" + outStr + "</result>";
            }

            try {
                InputStream in = fileItem.getInputStream();
                JbpmDeploy jbpmDeploy = new JbpmDeployImpl();

                // 部署
                deployResultXml.append(jbpmDeploy.deploy(in));
            } catch (Exception e) {
                logger.error("====== 工作流部署失败.", e);
            }
        }

        return "<result type=\"info\"><info>工作流部署成功.</info></result>";
    }
   

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
